// 算法储备思想练习




   // --------------------------------------------------
    // --------------------------------------------------
    // -------------author:zhoumingle---------------------
    // -------------递归思想的建立 专题-------------------
    // -------------递归思想的建立 专题-------------------
    // -------------递归思想的建立 专题--------------------
    // -------------递归思想的建立 专题--------------------
    // --------------------------------------------------
    // --------------------------------------------------


    
//1、斐波那契数列  1，1，2，3，5，8....求第15项？如何优化？
// 递归思想 
// 写法一
var count = 0;
function fib(n) { 
    // 递归的结束条件
    if (n === 1 || n === 0) {
        console.log('函数执行的次数：', count);
        return 1;
    };
    count ++;
    return fib(n-1) + fib(n-2);
};
// console.log(fib(15));

// 第二种写法  缓存----享元模式
let fibFn = (function () { 
    let cache = {};
    return function fib2(n) {
        if (cache.hasOwnProperty(n)) {
            return cache[n];
        };
        // count ++;
        // console.log('次数：', count);
        var v = (n === 0) || (n === 1) ? 1 : fib2(n-1) + fib2(n-2);
        cache[n] = v;
        return v
     }
})();
// console.log(fibFn(15));

// 写法三 数组写法【1，1，2，3，5....];
let arrFn = (function () { 
    let arr = [1,1];
    let res = 0;
    return function arrFib(n) { 
        let len = arr.length - 1;
        if (n <= len) {
            // console.log('ok', arr, n, arr[n])
            res = arr[n];
            return res;
        } else {
            arr.push((arr[len] + arr[len-1]));
            return arrFib(n);
        };
    }
 })();

//  console.log(arrFn(15))

// 第四种写法
let arrfn = function (n) { 
    let arr = [1, 1];
    while (arr.length-1 <= n) {
        arr.push(arr[n-1] + arr[n-2]);
    };
    return arr[arr.length-1];
 };

//  console.log(arrFn(15));


// 2.题目：将这个高维数组[1,2,[3,[4,5],6],7]转换成下面这个格式
		        // {
		        // 	children:[
		        // 	   {value:1},
		        // 	   {value:2},
		        // 	   {
		        // 	   	children:[
		        // 	   	   {value:3},
		        // 	   	   {
		        // 	   	   	children:[
		        // 	   	   	   {value:4},
		        // 	   	   	   {value:5}
		        // 	   	   	]
		        // 	   	   },
		        // 	   	   {value:6},
		        // 	   	]
		        // 	   },
		        // 	   {value:7},
		        // 	]
		        // }

// 递归思想
// 写法一
var formatFn = function (arr) {
    let resArr = [];
    for (let i =0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            resArr.push({children: formatFn(arr[i])});
        } else {
            resArr.push({value: arr[i]});
        }
    }
    return resArr;
}

let arr1 = [1,2,[3,[4,5],6],7];
// console.log(JSON.stringify(formatFn(arr1)))

// 写法二：
var formatFn2 = function (item) { 
    if (Array.isArray(item)) {
        return {
            children: item.map(item => formatFn2(item))
        }
    } else {
        return {
            value: item
        }
    }
 }

//  console.log(JSON.stringify(formatFn2(arr1)));




   // --------------------------------------------------
    // --------------------------------------------------
    // -------------author:zhoumingle---------------------
    // -------------指针思想的建立 专题-------------------
    // -------------指针思想的建立 专题-------------------
    // -------------指针思想的建立 专题--------------------
    // -------------指针思想的建立 专题--------------------
    // --------------------------------------------------
    // --------------------------------------------------



    //1.题目：请寻找出下面字符串中连续出现次数最多的字符串，他连续出现了几次？
	var str='aaaabbbbbccccccccdddddeeeeeeeeeeeeeeeee';

    // 指针思想
    function getStrMax(str) { 
        let resStr = '';
        let maxNum = 0;
        // 指针
        let point1 = 0;
        let point2 = 0;
        while(str.length - 1 >= point2) {
            if (str[point2] !== str[point1] && (point2 - point1) >= maxNum) {
                resStr = str[point1];
                maxNum = point2 - point1;
                point1 = point2;
            };
            point2 ++;
        }
        return {
            resStr,
            maxNum
        }
     }

    //  console.log(JSON.stringify(getStrMax(str)));

    // --------------------------------------------------
    // --------------------------------------------------
    // -------------author:zhoumingle---------------------
    // -------------栈思想的建立 专题-------------------
    // -------------栈思想的建立 专题-------------------
    // -------------栈思想的建立 专题--------------------
    // -------------栈思想的建立 专题--------------------
    // --------------------------------------------------
    // --------------------------------------------------

    // 题目：编写“智能重复”smartRepeat函数，实现：
    //  ——将'3[abc]'变成'abcabcabc'
    //  ——将'3[2[a]2[b]]'变成'aabbaabbaabb'
    //  ——将'3[1[a]3[b]2[3[c]4[d]]]'变成'abbbcccddddcccddddabbbcccddddcccddddabbbcccddddcccdddd'

    let str2 = '3[1[a]3[b]2[3[c]4[d]]]';
    function smartRepeat(str) { 
        //指针
        i = 0;
        // 剩余部分
        let remainderStr = str;
        // 存放数字的栈
        let stack1 = [1];
        // 存放字母的栈
        let stack2 = [''];
        // 遍历
        while (str.length > i) {
            remainderStr = str.substring(i);
            if (/^(\d+)\[/.test(remainderStr)) {
                let matcharr = remainderStr.match(/^(\d+)\[/);
                console.log(1);
                stack1.push(matcharr[1]);
                stack2.push('');
                i += matcharr[1].length + 1;
            } else if (/^\w+/.test(remainderStr)) {console.log(2)
                let matcharr = remainderStr.match(/^\w+/);
                stack2[stack2.length - 1] = matcharr[0];
                i += matcharr[0].length;
            } else if (/^\]/.test(remainderStr)) {
                console.log(3)
                let times = stack1.pop();
                let repeatStr = stack2.pop();
                stack2[stack2.length - 1] += repeatStr.repeat(times);
                i ++;
            }
            console.log(4)
        };
        console.log(stack1, stack2)
    };

    smartRepeat(str2)





